home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 2
/
Aminet AMIGA CDROM (1994)(Walnut Creek)[Feb 1994][W.O. 44790-1].iso
/
Aminet
/
dev
/
e
/
amigae21b.lha
/
Amiga_E_v2.1b
/
Sources
/
Utilities
/
ShowHunk.e
< prev
next >
Wrap
Text File
|
1992-09-02
|
25KB
|
876 lines
/* simple hunk-dump program with 680x0 disassembler for code hunks */
/*
WARNING: hunk_reloc32_short and hunk_relative_reloc hunks have not been
tested. If you find a file with this type of hunk, and this program
doesn't work with it, *PLEASE* contact the program authors so fixes may
be made.
*/
OPT OSVERSION=37
ENUM HUNK_UNIT=$3E7, HUNK_NAME, HUNK_CODE, HUNK_DATA, HUNK_BSS, HUNK_RELOC32,
HUNK_RELOC16, HUNK_RELOC8, HUNK_EXT, HUNK_SYMBOL, HUNK_DEBUG,
HUNK_END, HUNK_HEADER, HUNK_OVERLAY=$3F5, HUNK_BREAK, HUNK_DRELOC32,
HUNK_DRELOC16, HUNK_DRELOC8, HUNK_LIB, HUNK_INDEX, HUNK_RELOC32_S,
HUNK_REL_RELOC32
ENUM EXT_SYM=0, EXT_DEF, EXT_ABS, EXT_RES, EXT_NEWCOMMON, EXT_REF32=129,
EXT_COMMON, EXT_REF16, EXT_REF8, EXT_DREF32, EXT_DREF16, EXT_DREF8
ENUM ER_NONE,ER_FILE,ER_MEM,ER_USAGE,ER_HUNKID,ER_BREAK,ER_FILETYPE
DEF flen,o:PTR TO LONG,mem,handle=NIL,hunkid,noreloc=TRUE,hunknr=-1,f=TRUE
DEF pc:PTR TO INT,hibyte,eleven2nine,eight,seven2six,five2three,two2zero,isize
DEF tmp,fname[256]:STRING,disasm
PROC main()
DEF options:PTR TO LONG,rdargs
options:=[0,0]
IF rdargs:=ReadArgs('NAME/A,DISASM/S',options,NIL)
IF options[0] THEN StrCopy(fname,options[0],ALL)
disasm:=options[1]
FreeArgs(rdargs)
ELSE
error(ER_USAGE)
ENDIF
WriteF('ShowHunk v2.0 Copyright (c) 1993 Jim Cooper\n')
WriteF(' Original ShowHunk v0.1 (c) 1992 $#%!\n\n')
flen:=FileLength(fname)
handle:=Open(fname,OLDFILE)
IF (flen<1) OR (handle=NIL)
error(ER_FILE)
ELSE
mem:=New(flen)
IF mem=NIL
error(ER_MEM)
ELSE
IF Read(handle,mem,flen)<>flen THEN error(ER_FILE) ELSE process()
ENDIF
ENDIF
error(ER_NONE)
ENDPROC
PROC process()
DEF end,type
o:=mem
end:=o+flen
IF (o[]<>HUNK_HEADER) AND (o[]<>HUNK_UNIT) AND (o[]<>HUNK_LIB) THEN error(ER_FILETYPE)
WriteF('Hunk layout of file "\s" (\d bytes)\n\n',fname,flen)
WHILE o<end
IF CtrlC() THEN error(ER_BREAK)
type:=Int(o); hunkid:=Int(o+2); o:=o+4
IF (hunkid<>HUNK_UNIT) AND (hunkid<>HUNK_HEADER) AND (hunkid<>HUNK_BREAK) AND (hunkid<>HUNK_LIB) AND (hunkid<>HUNK_INDEX)
IF f
WriteF('HUNK \d',hunknr)
INC hunknr
ENDIF
f:=FALSE
ENDIF
IF type
IF type=$4000
WriteF('\t** hunk forced to CHIP-mem\n')
ELSE
WriteF('\t** type: \d\n',type)
ENDIF
ENDIF
SELECT hunkid
CASE HUNK_UNIT; WriteF('\thunk_unit: '); name()
CASE HUNK_NAME; WriteF('\thunk_name: '); name()
CASE HUNK_CODE;
WriteF('\thunk_code')
IF disasm
WriteF('\n'); code()
ELSE
WriteF(': \d bytes\n', skip())
ENDIF
CASE HUNK_DATA; WriteF('\thunk_data: \d bytes\n',skip())
CASE HUNK_BSS; WriteF('\thunk_bss: \d bytes\n',Mul(o[]++,4))
CASE HUNK_RELOC32; WriteF('\thunk_reloc32\n'); reloc(4)
CASE HUNK_RELOC16; WriteF('\thunk_reloc16\n'); reloc(4)
CASE HUNK_RELOC8; WriteF('\thunk_reloc8\n'); reloc(4)
CASE HUNK_EXT; WriteF('\thunk_ext\n'); symbol()
CASE HUNK_SYMBOL; WriteF('\thunk_symbol\n'); symbol()
CASE HUNK_DEBUG; WriteF('\thunk_debug: \d bytes\n',skip())
CASE HUNK_END; f:=TRUE
CASE HUNK_HEADER; WriteF('\thunk_header\n'); head()
CASE HUNK_OVERLAY; WriteF('\thunk_overlay\n'); overlay()
CASE HUNK_BREAK; WriteF('\thunk_break\n'); hunknr:=1; f:=TRUE
CASE HUNK_DRELOC32; WriteF('\thunk_data-reloc32\n'); reloc(4)
CASE HUNK_DRELOC16; WriteF('\thunk_data-reloc16\n'); reloc(4)
CASE HUNK_DRELOC8; WriteF('\thunk_data-reloc8\n'); reloc(4)
CASE HUNK_LIB; WriteF('\tlibrary_hunk: \d bytes\n',Mul(o[]++,4)); hunknr:=0
CASE HUNK_INDEX; WriteF('\tlibrary_index: \d bytes\n\n',skip())
CASE HUNK_RELOC32_S; WriteF('\thunk_reloc32_short\n'); reloc(2);
CASE HUNK_REL_RELOC32; WriteF('\thunk_relative_reloc32\n'); reloc(4);
DEFAULT
error(ER_HUNKID)
ENDSELECT
ENDWHILE
IF noreloc THEN WriteF('\nPosition independant code!\n') ELSE WriteF('\n')
ENDPROC
PROC overlay()
DEF m,ts
ts:=o[]++
WriteF('\t tablesize = \d\n',ts)
m:=o[]++-2
WriteF('\t max. level overlay tree uses = \d\n',m)
o:=ts*4+o
hunknr:=1; f:=TRUE
ENDPROC
PROC symbol()
DEF t,l,s,c,r
t:=Char(o); l:=Int(o+2); o:=o+4
WHILE l
IF CtrlC() THEN error(ER_BREAK)
IF t<EXT_NEWCOMMON /* sym def */
s:=o; o:=l*4+o; c:=o[]++; PutChar(o-4,0)
WriteF('\t \s = $\h\n',s,c)
ELSEIF t=EXT_COMMON OR t=EXT_NEWCOMMON /* common ref */
s:=o; o:=l*4+o; c:=o[]++; PutChar(o-4,0); r:=o[]++
WriteF('\t \s (\d ref\s) commonsize = \d\n',s,r,
IF r=1 THEN '' ELSE 's',c)
o:=r*4+o
ELSE /* sym ref */
s:=o; o:=l*4+o; r:=o[]++; PutChar(o-4,0)
WriteF('\t \s (\d ref\s)\n',s,r,IF r=1 THEN '' ELSE 's')
o:=r*4+o
ENDIF
t:=Char(o); l:=Int(o+2); o:=o+4
ENDWHILE
ENDPROC
PROC head()
DEF a,b
a:=0
b:=o[a]++
WHILE b
WriteF('\t libname: \s\n',o)
a:=a+b
b:=o[a]++
ENDWHILE
b:=o[]++
hunknr:=o[]++
a:=o[]++-hunknr+1
WriteF('\t #of hunks: \d\n',a)
o:=a*4+o
ENDPROC
PROC reloc(size)
DEF a
noreloc:=FALSE
a:=o[]++
WHILE a
IF CtrlC() THEN error(ER_BREAK)
WriteF('\t \d reloc entr\s for hunk #\d\n',a,
IF a=1 THEN 'y' ELSE 'ies',o[]++)
o:=a*size+o
a:=o[]++
ENDWHILE
ENDPROC
PROC name()
DEF a
a:=o[]++
WriteF('\s\n',o)
o:=a*4+o
ENDPROC
PROC skip()
DEF a
a:=Mul(o[]++,4)
o:=o+a
ENDPROC a
PROC error(nr)
IF handle THEN Close(handle)
WriteF('\n')
SELECT nr
CASE ER_FILE; WriteF('Could not read file "\s" !\n',fname)
CASE ER_MEM; WriteF('No memory for hunks!\n')
CASE ER_USAGE; WriteF('USAGE: ShowHunk <exe/objfile>\n')
CASE ER_HUNKID; WriteF('Illegal hunk id: $\h !\n',hunkid)
CASE ER_BREAK; WriteF('** BREAK: ShowHunk\n')
CASE ER_FILETYPE; WriteF('Not an executable or object file.\n')
ENDSELECT
CleanUp(0)
ENDPROC
PROC illegal()
WriteF('<illegal opcode: $\h>\n',pc[])
ENDPROC
PROC opsize(bit) RETURN ListItem(["b","w","l","?"],bit)
PROC bitsize(bit) RETURN IF bit THEN "l" ELSE "w"
/*
PROC bitsize(bit)
ENDPROC ListItem(["w","l"],bit)
*/
PROC immed(val)
WriteF(IF val < 16 THEN '\d' ELSE '$\h',val)
ENDPROC
PROC ccode(val,b) RETURN ListItem([IF b THEN 'ra' ELSE 't',
IF b THEN 'sr' ELSE 'f','hi','ls','cc','cs','ne','eq','vc',
'vs','pl','mi','ge','lt','gt','le','??'],val)
/*
PROC ccode(val,b)
IF val = 0
RETURN IF b THEN 'ra' ELSE 't'
ELSEIF val = 1
RETURN IF b THEN 'sr' ELSE 'f'
ELSE
RETURN ListItem(['hi','ls','cc','cs','ne','eq','vc','vs','pl','mi','ge','lt'
,'gt','le'],val-2)
ENDIF
ENDPROC '??'
*/
PROC ea(mode,reg,sd)
IF mode < 5 THEN
WriteF(ListItem(['d\d','a\d','(a\d)','(a\d)+','-(a\d)'],mode),reg)
SELECT mode
CASE 5;
WriteF('(')
immed(pc[1]++)
WriteF(',a\d)',reg)
CASE 6;
tmp:=pc[1]++
WriteF('(')
immed(tmp AND $f)
WriteF(',a\d,\s\d\s',reg,
IF tmp AND $8000 THEN 'a' ELSE 'd',
(Shr(tmp,12) AND 7),
IF tmp AND $800 THEN '.L)' ELSE '.W)')
CASE 7;
SELECT reg
CASE 0; WriteF('(\d).W',pc[1]++)
CASE 1; immed(^pc++)
CASE 2;
WriteF('(')
immed(pc[1]++)
WriteF(',PC)')
CASE 3;
tmp:=pc[1]++
WriteF('(')
immed(tmp AND $f)
WriteF(',PC,\c\d\s',IF tmp AND $8000 THEN "a" ELSE "d",
(Shr(tmp,12) AND 7),
IF tmp AND $800 THEN '.L)' ELSE '.W)')
CASE 4;
IF sd
WriteF('#')
immed(IF isize=2 THEN pc[1] ELSE Long(pc+2))
pc:=pc+isize
ELSE
WriteF('SR')
ENDIF
DEFAULT;
WriteF('<unknown ea!>')
ENDSELECT
ENDSELECT
ENDPROC
PROC movemregs(val,predec)
DEF index,first=1,regs:PTR TO LONG
regs:=['d0','d1','d2','d3','d4','d5','d6','d7',
'a0','a1','a2','a3','a4','a5','a6','a7']
IF predec
FOR index:=15 TO 0 STEP -1
IF val AND Shl(1,index)
IF first = 0 THEN WriteF('/')
WriteF(regs[15-index])
first:=0
ENDIF
ENDFOR
ELSE
FOR index:=0 TO 15 STEP 1
IF val AND Shl(1,index)
IF first = 0 THEN WriteF('/')
WriteF(regs[index])
first:=0
ENDIF
ENDFOR
ENDIF
ENDPROC
PROC code0000()
DEF c,tmp2
IF (eleven2nine = 7) OR (seven2six = 3)
IF (eleven2nine = 7) AND (eight = 0)
tmp:=pc[1]++
WriteF('moves.\c\t',opsize(seven2six))
IF Shr(tmp,11) AND 1
ea(five2three,two2zero,1)
WriteF(',\c\d\n',IF tmp AND $8000 THEN "a" ELSE "d",Shr(tmp,12) AND 7)
ELSE
WriteF('\c\d,',IF tmp AND $8000 THEN "a" ELSE "d",Shr(tmp,12) AND 7)
ea(five2three,two2zero,0)
WriteF('\n')
ENDIF
ELSEIF (eight = 0) AND (seven2six = 3)
tmp:=pc[1]++
IF (five2three = 7) AND (two2zero = 4)
tmp2:=pc[1]++
WriteF('cas2\td\d:d\d,d\d:d\d,\c\d:\c\d\n',
(tmp AND 7), (tmp2 AND 7),
(Shr(tmp,6) AND 7), (Shr(tmp2,6) AND 7),
IF tmp AND $8000 THEN "a" ELSE "d", (Shr(tmp,12) AND 7),
IF tmp2 AND $8000 THEN "a" ELSE "d", (Shr(tmp2,12) AND 7))
ELSE
WriteF('cas\td\d,d\d,',tmp AND 7, Shr(tmp,6) AND 7)
ea(five2three,two2zero,0)
WriteF('\n')
ENDIF
ELSE
illegal()
ENDIF
ELSE
IF five2three = 1
WriteF('movep.\c\t',bitsize(seven2six AND 1))
IF seven2six AND 2
WriteF('d\d,\d(a\d)\n',eleven2nine,pc[1]++,two2zero)
ELSE
WriteF('\d(a\d),d\d\n',pc[1]++,two2zero,eleven2nine)
ENDIF
ELSEIF (eight = 1) OR ((((eleven2nine AND 3) = 0) AND (eight = 0)))
WriteF(ListItem(['btst\t','bchg\t','bclr\t','bset\t'],seven2six))
IF eight = 1
WriteF('d\d,',eleven2nine)
ELSE
WriteF('#\d,',pc[1]++)
ENDIF
ea(five2three,two2zero,0)
WriteF('\n')
ELSE
IF seven2six = 3
tmp:=pc[1]++
WriteF('\s.\c\t',IF Shr(tmp,11) AND 1 THEN 'chk2' ELSE 'cmp2',opsize(eleven2nine))
ea(five2three,two2zero,1)
WriteF(',\c\d\n',IF tmp AND $8000 THEN "d" ELSE "a",Shr(tmp,12) AND 3)
ELSE
c:=ListItem(['ori.','andi.','subi.','addi.',0,'eori.','cmpi.',0],eleven2nine)
IF c THEN WriteF(c) ELSE illegal()
WriteF('\c\t#',opsize(seven2six))
immed(IF seven2six < 2 THEN pc[1]++ ELSE ^pc++)
WriteF(',')
ea(five2three,two2zero,0)
WriteF('\n')
ENDIF
ENDIF
ENDIF
ENDPROC
PROC code0100()
DEF subfield,bitseven,bitsix,curcode
bitseven:=Shr(seven2six,1)
bitsix:=seven2six AND 1
IF pc[] = $4afa
WriteF('bgnd\n')
ELSE
IF eight = 1
IF bitsix = 1
WriteF('lea\t')
ea(five2three,two2zero,1)
WriteF(',a\d\n',eleven2nine)
ELSE
WriteF('chk\t')
ea(five2three,two2zero,0)
WriteF(',d\d\n',eleven2nine)
ENDIF
ELSE
subfield:=Shl(eleven2nine,1)+eight
SELECT subfield
CASE 0;
IF seven2six = 3
WriteF('move.w\t')
ea(five2three,two2zero,1)
WriteF(',sr\n')
ELSE
WriteF('negx.\c\t',opsize(seven2six))
ea(five2three,two2zero,0)
WriteF('\n')
ENDIF
CASE 1;
IF seven2six = 3
WriteF('move.w\tccr,')
ea(five2three,two2zero,0)
WriteF('\n')
ELSE
illegal()
ENDIF
CASE 2;
WriteF('clr.\c\t',opsize(seven2six))
ea(five2three,two2zero,0)
WriteF('\n')
CASE 4;
IF seven2six = 3
WriteF('move.w\t')
ea(five2three,two2zero,1)
WriteF(',ccr\n')
ELSE
WriteF('neg.\c\t',opsize(seven2six))
ea(five2three,two2zero,0)
WriteF('\n')
ENDIF
CASE 6;
IF seven2six = 3
WriteF('move.w\tsr,')
ea(five2three,two2zero,0)
WriteF('\n')
ELSE
WriteF('not.\c\t',opsize(seven2six))
ea(five2three,two2zero,0)
WriteF('\n')
ENDIF
CASE 8;
IF seven2six = 0
IF five2three = 1
WriteF('link.l\ta\d,#-$\h\n',two2zero,0-1-^pc++)
ELSE
WriteF('nbcd\t')
ea(five2three,two2zero,0)
WriteF('\n')
ENDIF
ELSEIF seven2six = 1
IF five2three = 0
WriteF('swap\td\d\n',two2zero)
ELSEIF five2three = 1
WriteF('bkpt\t#\d\n',two2zero)
ELSE
WriteF('pea\t')
ea(five2three,two2zero,0)
WriteF('\n')
ENDIF
ELSE
IF five2three = 0
IF (Shl(eight,2)+seven2six) = 7 THEN WriteF('extb.l\td\d\n',two2zero) ELSE WriteF('ext.\c\td\d\n',bitsize(bitsix),two2zero)
ELSE
WriteF('movem.\c\t',bitsize(bitsix))
movemregs(pc[1]++, IF five2three = 4 THEN 1 ELSE 0)
WriteF(',')
ea(five2three,two2zero,0)
WriteF('\n')
ENDIF
ENDIF
CASE 10;
IF pc[] = $4afc
WriteF('illegal\n')
ELSE
IF seven2six = 3
WriteF('tas\t')
ea(five2three,two2zero,0)
WriteF('\n')
ELSE
WriteF('tst.\c\t',opsize(seven2six))
ea(five2three,two2zero,0)
WriteF('\n')
ENDIF
ENDIF
CASE 12;
tmp:=pc[1]++
IF (Shl(eight,2)+seven2six) < 2
IF seven2six = 1
WriteF('div\c',IF Shr(tmp,11) AND 1 THEN "s" ELSE "u")
IF ((Shr(tmp,10) AND 1) = 0) AND ((Shr(tmp,12) AND 7) <> (tmp AND 7))
WriteF('l.l\t')
ea(five2three,two2zero,1)
WriteF(',d\d:d\d\n',Shr(tmp,12) AND 7,tmp AND 7)
ELSE
WriteF('.l\t')
ea(five2three,two2zero,1)
WriteF(',d\d',Shr(tmp,12) AND 7)
IF Shr(tmp,10) AND 1 THEN WriteF(':d\d',tmp AND 7)
WriteF('\n')
ENDIF
ELSE
WriteF('mul\c.l\t',IF Shr(tmp,11) AND 1 THEN "s" ELSE "u")
ea(five2three,two2zero,1)
WriteF(',d\d',Shr(tmp,12) AND 7)
IF Shr(tmp,10) AND 1 THEN WriteF(':d\d',tmp AND 7)
WriteF('\n')
ENDIF
ELSE
WriteF('movem.\c\t',bitsize(bitsix))
ea(five2three,two2zero,0)
WriteF(',')
movemregs(tmp, IF five2three = 4 THEN 1 ELSE 0)
WriteF('\n')
ENDIF
CASE 14;
curcode:=pc[]
SELECT curcode
CASE $4e70;
WriteF('reset\n')
CASE $4e71;
WriteF('nop\n')
CASE $4e72;
WriteF('stop\n')
CASE $4e73;
WriteF('rte\n')
CASE $4e74;
WriteF('rtd\t#\d\n',(Shl(pc[1]<32767+1,16)-pc[1]++))
CASE $4e75;
WriteF('rts\n')
CASE $4e76;
WriteF('trapv\n')
CASE $4e77;
WriteF('rtr\n')
DEFAULT;
IF bitseven = 1
WriteF(IF bitsix = 1 THEN 'jmp\t' ELSE 'jsr\t')
ea(five2three,two2zero,0)
WriteF('\n')
ELSE
IF bitsix = 1
tmp:=Shr(five2three,1)
SELECT tmp
CASE 0;
WriteF('trap\t\d\n',(Shl((five2three AND 1),2)+two2zero))
CASE 1;
IF five2three AND 1
WriteF('unlk\ta\d\n',two2zero)
ELSE
WriteF('link.w\ta\d,#-$\h\n',two2zero,65536-pc[1]); pc++
ENDIF
CASE 2;
WriteF(IF five2three AND 1 THEN 'move\tusp,a\d\n' ELSE 'move\ta\d,usp\n',two2zero)
CASE 3;
WriteF('rtm\t\c\d\n',IF five2three AND 1 THEN "a" ELSE "d",two2zero)
ENDSELECT
ELSE
illegal()
ENDIF
ENDIF
ENDSELECT
DEFAULT; illegal()
ENDSELECT
ENDIF
ENDIF
ENDPROC
PROC code0101()
IF seven2six < 3
WriteF(IF eight = 1 THEN 'subq.' ELSE 'addq.')
WriteF('\c\t#\d,',opsize(seven2six),eleven2nine)
ea(five2three,two2zero,0)
WriteF('\n')
ELSE
IF five2three = 1
WriteF('db\s\td\d,L\z\h[8]\n',
ccode((Shl(eleven2nine,1)+eight),0),
two2zero,
pc-o-2-(Shl(pc[1]<32767+1,16)-pc[1]))
pc++
ELSEIF five2three = 7
WriteF('trap\s',ccode(Shl(eleven2nine,1)+eight,0))
IF two2zero < 4
IF two2zero AND 1 THEN WriteF('.w\t#\d',pc[1]++) ELSE WriteF('.l\t#\d',^pc++)
ENDIF
WriteF('\n')
ELSE
WriteF('s\s\t',ccode(Shl(eleven2nine,1)+eight,0))
ea(five2three,two2zero,0)
WriteF('\n')
ENDIF
ENDIF
ENDPROC
PROC code0110()
DEF tmp2,ctl:PTR TO LONG
IF (pc[] AND $fffe) = $4e7a
tmp:=pc[1]++
tmp2:= tmp AND $fff
IF tmp2 > 7
ctl:=ListItem(['usp','vbr','caar','msp','isp','mmusr','urp','srp'],tmp2 - $800)
ELSE
ctl:=ListItem(['sfc','dfc','cacr','tc','itt0','itt1','dtt0','dtt1'],tmp2)
ENDIF
IF ctl
WriteF('movec\t')
IF pc[-1] AND 1
WriteF('\s,\c\d\n',ctl,IF tmp AND $8000 THEN "a" ELSE "d",Shr(tmp,12) AND 7)
ELSE
WriteF('\c\d,\s\n',IF tmp AND $8000 THEN "a" ELSE "d",Shr(tmp,12) AND 7,ctl)
ENDIF
ELSE
illegal()
ENDIF
ELSE
WriteF('b\s',ccode((Shl(eleven2nine,1)+eight),1))
tmp:=Char(pc+1)
IF tmp = 0
WriteF('.w\tL\z\h[8]\n',pc-o-2-(Shl(pc[1]<32767+1,16)-pc[1]))
pc++
ELSE
WriteF('.b\tL\z\h[8]\n',pc-o-2-(Shl(tmp<127+1,8)-tmp))
ENDIF
ENDIF
ENDPROC
PROC code1000()
IF Shr(five2three,1) = 0
IF eight
IF seven2six
SELECT seven2six
CASE 1; WriteF('pack\t')
CASE 2; WriteF('unpk\t')
DEFAULT; illegal()
ENDSELECT
WriteF(IF five2three AND 1 THEN '-(a\d),-(a\d),#\d\n' ELSE 'd\d,d\d,#\d\n',two2zero,eleven2nine,pc[1]++)
ELSE
WriteF(IF five2three AND 1 THEN 'sbcd\t-(a\d),-(a\d)\n' ELSE 'sbcd\td\d,-d\d\n',two2zero,eleven2nine)
ENDIF
ELSE
illegal()
ENDIF
ELSE
IF seven2six = 3
WriteF(IF eight = 1 THEN 'divs\t' ELSE 'divu\t')
ea(five2three,two2zero,1)
WriteF(',d\d\n',eleven2nine)
ELSE
WriteF('or.\c\t',opsize(seven2six))
IF eight = 1
WriteF('d\d,',eleven2nine)
ea(five2three,two2zero,0)
ELSE
ea(five2three,two2zero,1)
WriteF(',d\d',eleven2nine)
ENDIF
WriteF('\n')
ENDIF
ENDIF
ENDPROC
PROC code1001()
IF seven2six = 3
WriteF('suba.\c\t',bitsize(eight))
ea(five2three,two2zero,1)
WriteF(',a\d\n',eleven2nine)
ELSE
IF (Shr(five2three,1) = 0) AND (eight = 1)
WriteF('subx.\c\t',opsize(seven2six))
WriteF(IF five2three AND 1 THEN '-(a\d),-(a\d)\n' ELSE 'd\d,d\d\n',two2zero,eleven2nine)
ELSE
WriteF('sub.\c\t',opsize(seven2six))
IF eight = 1
WriteF('d\d,',eleven2nine)
ea(five2three,two2zero,0)
WriteF('\n')
ELSE
ea(five2three,two2zero,1)
WriteF(',d\d\n',eleven2nine)
ENDIF
ENDIF
ENDIF
ENDPROC
PROC code1011()
IF seven2six = 3
WriteF('cmpa.\c\t',bitsize(eight))
ea(five2three,two2zero,1)
WriteF(',a\d\n',eleven2nine)
ELSE
IF five2three = 1
WriteF('cmpm.\c\t(a\d)+,(a\d)+\n',opsize(seven2six),two2zero,eleven2nine)
ELSE
IF eight = 1
WriteF('eor.\c\td\d,',opsize(seven2six),eleven2nine)
ea(five2three,two2zero,0)
WriteF('\n')
ELSE
WriteF('cmp.\c\t',opsize(seven2six))
ea(five2three,two2zero,1)
WriteF(',d\d\n',eleven2nine)
ENDIF
ENDIF
ENDIF
ENDPROC
PROC code1100()
IF seven2six = 3
WriteF(IF eight = 1 THEN 'mulu.w\t' ELSE 'muls.w\t')
ea(five2three,two2zero,1)
WriteF(',d\d\n',eleven2nine)
ELSE
IF Shr(five2three,1) <> 0
WriteF('and.\c\t',opsize(seven2six))
IF eight = 1
WriteF('d\d,',eleven2nine)
ea(five2three,two2zero,0)
WriteF('\n')
ELSE
ea(five2three,two2zero,1)
WriteF(',d\d\n',eleven2nine)
ENDIF
ELSE
IF seven2six = 0
WriteF(IF five2three AND 1 THEN 'abcd\t-(a\d),-(a\d)\n' ELSE 'abcd\td\d,d\d\n',two2zero,eleven2nine)
ELSE
WriteF('exg\t')
tmp:=Shl(seven2six,3)+five2three
IF tmp = 8
WriteF('d\d,d\d\n',two2zero,eleven2nine)
ELSEIF tmp = 9
WriteF('a\d,a\d\n',two2zero,eleven2nine)
ELSEIF tmp = 17
WriteF('a\d,d\d\n',two2zero,eleven2nine)
ELSE
illegal()
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
PROC code1101()
IF seven2six = 3
WriteF('adda.\c\t',bitsize(eight))
ea(five2three,two2zero,1)
WriteF(',a\d\n',eleven2nine)
ELSE
IF (Shr(five2three,1) = 0) AND (eight = 1)
WriteF('addx.\c\t',opsize(seven2six))
WriteF(IF five2three AND 1 THEN '-(a\d),-(a\d)\n' ELSE 'd\d,d\d\n',two2zero,eleven2nine)
ELSE
WriteF('add.\c\t',opsize(seven2six))
IF eight = 1
WriteF('d\d,',eleven2nine)
ea(five2three,two2zero,0)
WriteF('\n')
ELSE
ea(five2three,two2zero,1)
WriteF(',d\d\n',eleven2nine)
ENDIF
ENDIF
ENDIF
ENDPROC
PROC code1110()
DEF subfield,tmp2
IF seven2six = 3
tmp:=pc[1]++
tmp2:=tmp AND 31
subfield:=Shl((eleven2nine AND 3),1)+eight
WriteF(ListItem(['bftst','bfextu','bfchg','bfexts','bfclr','bfffo','bfset','bfins'],subfield))
WriteF('\t')
IF subfield = 7 THEN WriteF('d\d,',Shr(tmp,12) AND 7)
ea(five2three,two2zero,0)
WriteF(IF Shr(tmp,11) AND 1 THEN '{d\d:' ELSE '{\d:',Shr(tmp,6) AND 31)
WriteF(IF Shr(tmp,5) AND 1 THEN 'd\d}' ELSE '\d}',IF tmp2 THEN tmp2 ELSE 32)
IF (subfield < 7) AND (subfield AND 1) THEN WriteF(',d\d',Shr(tmp,12) AND 7)
WriteF('\n')
ELSE
WriteF('\s\c',ListItem(['as','ls','rox','ro'],IF seven2six=3 THEN eleven2nine ELSE five2three AND 3),IF eight=1 THEN "l" ELSE "r")
IF seven2six = 3
WriteF('\t')
ea(five2three,two2zero,0)
WriteF('\n')
ELSE
WriteF(IF five2three AND 4 THEN '.\c\td\d,d\d\n' ELSE '\c\t#\d,d\d\n',opsize(seven2six),eleven2nine,two2zero)
ENDIF
ENDIF
ENDPROC
PROC code()
DEF number
isize:=2
number:=Shl(o[],2)+o+4
pc:=o+4
WriteF('\n')
WHILE (pc < number)
hibyte:=Shr(Char(pc),4)
eleven2nine:=Shr(Char(pc),1) AND 7
eight:=Char(pc) AND 1
seven2six:=Shr(Char(pc+1),6) AND 3
five2three:=Shr(Char(pc+1),3) AND 7
two2zero:=Char(pc+1) AND 7
IF CtrlC() THEN error(ER_BREAK) /* essential! */
WriteF('L\z\h[8]:',pc-o-4) /* for offsets */
WriteF('\t')
IF (hibyte > 0) AND (hibyte < 4)
WriteF(IF (eight=0) AND (seven2six=1) THEN 'movea.' ELSE 'move.')
SELECT hibyte
CASE 1; WriteF('b')
CASE 2; WriteF('l'); isize:=4
CASE 3; WriteF('w')
ENDSELECT
WriteF('\t')
ea(five2three,two2zero,1)
WriteF(',')
ea(Shl(eight,2)+seven2six,eleven2nine,0)
WriteF('\n')
isize:=2
ELSE
SELECT hibyte
CASE 0; /* Bit Manipulation/MOVEP/immediate */
code0000()
CASE 4; /* Miscellaneous */
code0100()
CASE 5; /* ADDQ/SUBQ/Scc/DBcc/TRAPcc */
code0101()
CASE 6; /* Bcc/BSR/BRA/MOVEC */
code0110()
CASE 7; /* MOVEQ */
WriteF('moveq\t#')
immed(Char(pc+1))
WriteF(',d\d\n',eleven2nine)
CASE 8; /* OR/DIV/SBCD */
code1000()
CASE 9; /* SUB/SUBA/SUBX */
code1001()
CASE 10; /* (unassigned, reserved) */
illegal()
CASE 11; /* CMP/EOR */
code1011()
CASE 12; /* AND/MUL/ABCD/EXG */
code1100()
CASE 13; /* ADD/ADDX */
code1101()
CASE 14; /* Shift/Rotate/Bit Field */
code1110()
CASE 15; /* Coprocessor Interface */
illegal()
ENDSELECT
ENDIF
pc++
ENDWHILE
WriteF('\n')
o:=number
ENDPROC